#pragma once
#include <string>
#include <iostream>
#include <vector>
#include <sstream>

using namespace std;
const static string SEP = "\r\n";
const static string ROOTPATH = "./wwwroot";
const static string HOMEPAGE = "index.html";

struct HttpRequest
{
    vector<string> reqHeader;       // 请求行，请求报头
    string text;                    // 正文部分
    string method;                  // 方法
    string url;                     // 统一资源定位符
    string httpVersion;             // http版本
    string filePath = ROOTPATH;                // 最终要访问文件的路径，根据用户输入的不同进行处理

    // 将http的requset请求拆解。
    void deserialize(string req)
    {
        for(;;) {
            size_t pos = req.find(SEP);
            if(pos == string::npos) {
                // 什么都没找到
                return;
            }

            string tmp = req.substr(0, pos);
            if(tmp == "") {
                // 找到了空行
                break;
            } 

            reqHeader.push_back(tmp);
            // 移该已经添加到数组的部分（别忘了移除SEP）
            req.erase(req.begin(), req.begin() + pos + SEP.size());
        }
        // 假设这是一个完整的请求。那么剩下的就都是text了。
        text = req;
    }

    // 解析请求行
    void parseHeadLine()
    {
        istringstream iss(reqHeader[0]); 
        iss >> method >> url >> httpVersion;

        if(url == "/" || url == "/index.html" || url == "/favicon.ico") {
            // 进入默认页面 (现在是./wwwroot/index.html)
            filePath += "/";
            filePath += HOMEPAGE;
            /*ps: “/favicon.ico” 是请求的资源路径。“/” 表示服务器的根目录路径，“favicon.ico” 是文件名。
            这个文件通常是网站的图标文件。当浏览器访问一个网站时，会自动尝试获取这个图标文件，
            用于在浏览器的标签页、书签栏等位置显示网站的图标。这样可以让用户更容易识别不同的网站。*/
        } else {
            // 如果用户输入了url（假设输入为/aaab，就进入它输入的那个
            filePath += url;
        }
    }

    // 用来打印信息
    void printInfo()
    {
        printf("====================================\n");

        for (const auto &e : reqHeader) {
            printf("%s\n\n", e.c_str());
        }
        
        printf("method: %s\nurl: %s\nhttpVersion: %s\nfilePath: %s\n"
        , method.c_str(), url.c_str(), httpVersion.c_str(), filePath.c_str());
        printf("\ntext:%s\n", text.c_str());
        printf("====================================\n");
    }
};